package com.sinosoft.dsp.platform.services;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.NoneScoped;

import com.sinosoft.builder.templates.concept.BusinessConcept;
import com.sinosoft.builder.templates.concept.Document;
import com.sinosoft.builder.templates.concept.DocumentItemSetType;
import com.sinosoft.builder.templates.concept.DocumentNumberType;
import com.sinosoft.builder.templates.concept.PageType;
import com.sinosoft.builder.templates.concept.TagElementType;
import com.sinosoft.builder.templates.concept.TemplateType;
import com.sinosoft.builder.templates.concept.TempletSetType;
import com.sinosoft.dsp.platform.manager.ApplicationBuilder;
import com.sinosoft.dsp.platform.utils.SinoManagedBean;
import com.sinosoft.dsp.system.core.log.Log;

/**
 * 文书服务类
 * 
 * @author 潘巍（PeterPan）
 * @since 2011-6-26 下午09:25:57
 * @杨虎
 * @修改 2011-7-27 下午18:0:0
 * 
 */
@ManagedBean(name = "documentService")
@NoneScoped
public class DocumentService {
	private static final Log log = Log.getLog(DocumentService.class.getName());

	/**
	 * 初始化文书对象
	 */
	private void initDocument() {
		Map<String, Document> doc = new HashMap<String, Document>();
		ApplicationBuilder ab = SinoManagedBean.findBean("applicationBuilder");
		BusinessConcept bc = ab.getConcept();
		if (bc.getDocumentConcept() != null
				&& bc.getDocumentConcept().getDocument() != null) {
			for (Document d : bc.getDocumentConcept().getDocument()) {
				doc.put(d.getId(), d);
			}
		}
		ab.setDocuments(doc);
	}

	/**
	 * 通过文书ID获得文书对象
	 * 
	 * @param id
	 * @return
	 */
	public Document getDocumentById(String id) {
		try {
			ApplicationBuilder ab = SinoManagedBean
					.findBean("applicationBuilder");
			if (ab.getDocuments() == null) {
				initDocument();
			}
			return ab.getDocuments().get(id);
		} catch (Exception e) {
			log.error("通过文书ID获得文书对象出现错误(getDocumentById)！");
		}
		return null;
	}

	/**
	 * 通过文书ID获得文书序列号
	 * 
	 * @param documentId
	 *            文书ID
	 * @return
	 */
	public String getDocumentNumberExpression(String documentId) {
		try {
			Document doc = getDocumentById(documentId);
			if (doc == null)
				return null;
			DocumentNumberType documentNumber = doc.getDocumentNumber();
			if (documentNumber == null)
				return null;
			return documentNumber.getExpression();
		} catch (Exception e) {
			log.error("通过文书ID获得文书序列号出现错误(getDocumentNumberExpression)！");
		}
		return null;

	}

	/**
	 * 通过文书ID获得表单标签元素 列表集合
	 * 
	 * 
	 * @param documentId
	 *            文书ID
	 * @return
	 */
	public List<TagElementType> getTagElement(String documentId) {
		try {
			Document doc = getDocumentById(documentId);
			if (doc == null)
				return null;
			DocumentItemSetType documentItemSet = doc.getDocumentItemSet();
			if (documentItemSet == null)
				return null;
			return documentItemSet.getTagElement();
		} catch (Exception e) {
			log.error("通过获得表单标签元素 列表集合出现错误(getTagElement)！");
		}
		return null;
	}

	/**
	 * 通过文书ID和模板id获得模板
	 * 
	 * 
	 * @param documentId
	 *            文书ID
	 * @param templateId
	 *            模板ID
	 * @return
	 */
	public TemplateType getTemplate(String documentId, String templateId) {
		if (documentId == null || templateId == null)
			return null;
		try {
			Document doc = getDocumentById(documentId);
			if (doc == null)
				return null;
			TempletSetType templetSet = doc.getTempletSet();
			if (templetSet == null)
				return null;
			List<TemplateType> list = templetSet.getTemplate();
			if (list == null)
				return null;
			for (TemplateType template : list) {
				if (templateId.equalsIgnoreCase(template.getId()))
					return template;
			}
		} catch (Exception e) {
			log.error("获得模板出现错误(getTemplate)！");
		}
		return null;

	}

	/**
	 * 通过文书ID和模板id获得Page对象集合
	 * 
	 * 
	 * @param documentId
	 *            文书ID
	 * @param templateId
	 *            模板ID
	 * @return
	 */
	public List<PageType> getPageList(String documentId, String templateId) {
		TemplateType template = getTemplate(documentId, templateId);
		if (template != null)
			return template.getPage();
		return null;

	}

	 

	 

 
	/**
	 * 通过文书ID、模板id、Page获得PageType对象
	 * 
	 * 
	 * @param documentId
	 *            文书ID
	 * @param templateId
	 *            模板ID
	 * @param pageID
	 *            pageID
	 * @return
	 */

	public PageType getPage(String documentId, String templateId, String pageID) {

		if (documentId == null || templateId == null)
			return null;
		try {
			List<PageType> pageList = getPageList(documentId, templateId);
			for (PageType page : pageList) {
				if (page.getId().equalsIgnoreCase(pageID)) {
					return page;
				}
			}
		} catch (Exception e) {
			log.error("获得PageType对象(getPage)！");
		}
		return null;
	}

}
